﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Libreria.RFID.Modelo;

namespace Libreria.RFID.Negocio
{
   public class RegistroDeAccesoNegocio
    {
        public List<RegistroDeAcceso> consultarRegistroDeAcceso(String CadenaDeConexion)
        {
            RegistroDeAcceso registrodeacceso = new RegistroDeAcceso(CadenaDeConexion);
            return registrodeacceso.consultar();
        }

        public List<RegistroDeAcceso> busquedaPorFiltros(String numeroDocumento, DateTime fi, DateTime ff, String CadenaDeConexion, out String mensaje)
        {
            List<RegistroDeAcceso> registroTemp = new List<RegistroDeAcceso>();
            List<Persona> listapersonas = new List<Persona>();
            mensaje = "";

            Persona persona = new Persona(CadenaDeConexion);
            persona.Codigo = null;
            persona.TipoDeDocumento = null;
            persona.NumeroDeDocumento = numeroDocumento;
            persona.Nombre = null;
            persona.Apellido = null;
            persona.Genero = null;
            persona.FechaDeNacimiento = DateTime.MinValue;
            persona.Direccion = null;
            persona.Telefono = null;
            persona.CorreoElectronico = null;
            persona.Estado = null;

            listapersonas = persona.consultar();
            if (listapersonas.Count() == 1 || string.IsNullOrEmpty(numeroDocumento))
            {
                persona = listapersonas[0];

                RegistroDeAcceso registrodeacceso = new RegistroDeAcceso(CadenaDeConexion);
                registrodeacceso.IdentificadorAcceso = null;
                registrodeacceso.CodigoTAG = null;
                registrodeacceso.CodigoPersona = string.IsNullOrEmpty(numeroDocumento) ? null : persona.Codigo;
                registrodeacceso.FechaEntrada = DateTime.MinValue;
                registrodeacceso.FechaSalida = DateTime.MinValue;

                registroTemp = registrodeacceso.consultar();

                if (fi != DateTime.MinValue || ff != DateTime.MinValue)
                {
                    for (int i = registroTemp.Count - 1; i >= 0; i--)
                    {
                        if (fi != DateTime.MinValue && ff != DateTime.MinValue)
                        {
                            if (registroTemp[i].FechaEntrada < fi || registroTemp[i].FechaSalida > ff)
                            {
                                registroTemp.Remove(registroTemp[i]);
                            }
                        }
                        else if (fi != DateTime.MinValue)
                        {
                            if (registroTemp[i].FechaEntrada < fi || registroTemp[i].FechaEntrada >= fi.AddDays(1))
                            {
                                registroTemp.Remove(registroTemp[i]);
                            }
                        }
                        else
                        {
                            if (registroTemp[i].FechaSalida < ff || registroTemp[i].FechaSalida >= ff.AddDays(1))
                            {
                                registroTemp.Remove(registroTemp[i]);
                            }
                        }
                    }

                }
            }
            else
            {
                if (listapersonas.Count > 1)
                {
                    mensaje = "Más de una persona tiene registrado el número de documento, contacte al administrador del sistema";
                }
                else
                {
                    mensaje = "Nínguna persona tiene registrado el número de documento, verífique el número de documento: " + numeroDocumento + "; ó contacte al administrador del sistema";
                }
            }
    
            foreach (RegistroDeAcceso item in registroTemp)
            {
                item.NombrePersona = new Persona(CadenaDeConexion).consultarPorCodigo(item.CodigoPersona.Value).Nombre;
            }

            return registroTemp;
        }

        public RegistroDeAcceso consultarPorCodigoPersona(Int32 CodigoPersona, String CadenaDeConexion)
        {
            RegistroDeAcceso codPer = new RegistroDeAcceso(CadenaDeConexion);
            codPer.IdentificadorAcceso = null;
            codPer.CodigoTAG = null;
            codPer.CodigoPersona = CodigoPersona;
            codPer.FechaEntrada = DateTime.MinValue;
            codPer.FechaSalida = DateTime.MinValue;
            List<RegistroDeAcceso> rdal = codPer.consultar();
            codPer.IdentificadorAcceso = 0;
            foreach (RegistroDeAcceso rda in rdal)
            {
                if (rda.IdentificadorAcceso > codPer.IdentificadorAcceso)
                {
                    codPer = rda;
                }
            }
            return codPer;

           
        }

        public void crearRegistroDeAcceso(Int32 Identificador, String CodigoTAG, Int32 CodigoPersona, DateTime fechaEntrada, DateTime fechaSalida, String CadenaDeConexion)
        {
            RegistroDeAcceso registroDeAccesoACrear = new RegistroDeAcceso(CadenaDeConexion);
            registroDeAccesoACrear.IdentificadorAcceso = null;
            registroDeAccesoACrear.CodigoTAG = CodigoTAG;
            registroDeAccesoACrear.CodigoPersona = CodigoPersona;
            registroDeAccesoACrear.FechaEntrada = fechaEntrada;
            registroDeAccesoACrear.FechaSalida = fechaSalida;
            registroDeAccesoACrear.crear();
        }

        public void actualizarRegistroDeAcceso(Int32 Identificador, String CodigoTAG, Int32 CodigoPersona, DateTime fechaEntrada, DateTime fechaSalida, String CadenaDeConexion)
        {
            RegistroDeAcceso registroDeAccesoAActualizar = new RegistroDeAcceso(CadenaDeConexion);
            registroDeAccesoAActualizar.IdentificadorAcceso = Identificador;
            registroDeAccesoAActualizar.CodigoTAG = CodigoTAG;
            registroDeAccesoAActualizar.CodigoPersona = CodigoPersona;
            registroDeAccesoAActualizar.FechaEntrada = fechaEntrada;
            registroDeAccesoAActualizar.FechaSalida = fechaSalida;
            registroDeAccesoAActualizar.actualizar();
        }

        public void eliminarRegistroDeAcceso(Int32 Identificador, String CadenaDeConexion)
        {
            RegistroDeAcceso registroDeAccesoAEliminar = new RegistroDeAcceso(CadenaDeConexion);
            registroDeAccesoAEliminar.IdentificadorAcceso = Identificador;
            registroDeAccesoAEliminar.CodigoTAG = null;
            registroDeAccesoAEliminar.CodigoPersona = null;
            registroDeAccesoAEliminar.FechaEntrada = DateTime.MinValue;
            registroDeAccesoAEliminar.FechaSalida = DateTime.MinValue;
            registroDeAccesoAEliminar.eliminar();
        }
    }
}
